package zpe.controledeacesso.jsf.view.bean;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.servlet.http.HttpServletRequest;

import zpe.controledeacesso.model.bean.Permissoes;
import zpe.controledeacesso.model.bean.Usuario;
import zpe.controledeacesso.security.Acesso;
import zpe.controledeacesso.service.LoginService;
import zpe.genericcrud.exception.ApplicationException;
import zpe.genericcrud.jsf.view.bean.FacesUtils;

@ManagedBean(name="loginBean")
@SessionScoped
public class LoginBean implements Serializable{

	private static final long serialVersionUID = 1499459111713591101L;

	@ManagedProperty("#{loginService}")
	private LoginService service;

	private Usuario usuario = new Usuario();
	
	private Map<String, Acesso> acessos = new HashMap<String, Acesso>(0);
	
	/**
	 * Autentica um usuário.
	 * @author Samuel Soares
	 * @return String
	 */
	public String autenticar() {
				
		try {
			Usuario usuario = getService().autenticar( getUsuario() );
			Map<String, Permissoes> perms = getService().buscarPermissoes( usuario );
			
			HttpServletRequest request = (HttpServletRequest) FacesUtils.getServletRequest();
			if( perms.isEmpty() ){
				usuario = null;
				perms = null;
				FacesUtils.addErrorMessage( "Você não tem permissão de acesso a esse sistema." );
				request.getSession().invalidate();
				return null;
			}
									
			//Setando usuário padrão na sessão para facilitar consulta de alguns dados e verificar se está logado no sistema.
			request.getSession().setAttribute("usuario", usuario);
			//request.getSession().setAttribute("permissoes", perms);			
						
			//Configurando tempo da sessão para 30 minutos (1800 milisegundos)
			request.getSession().setMaxInactiveInterval( 1800 );
			Acesso acesso = new Acesso( perms );
			acessos = acesso.mapeiaPermissoes();
			request.getSession().setAttribute("acessos", acessos);
			request.getSession().setAttribute("pagesNoFilter", Acesso.getPagesNoFilter() );
			request.getSession().setAttribute("dirsNoFilter", Acesso.getDirectoriesNoFilter() );
			request.getSession().setAttribute("pagesSystem", Acesso.getPages() );
			return "home";
		} catch (ApplicationException ex) {
			FacesUtils.addErrorMessage( ex.getMessage() );
			return null;
		}
	}
	
	
	public String logout() {		
		HttpServletRequest request = (HttpServletRequest) FacesUtils.getServletRequest();
		request.getSession().invalidate();
		return "logout";
	}

	public LoginService getService() {
		return service;
	}

	public void setService(LoginService service) {
		this.service = service;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Map<String, Acesso> getAcessos() {
		return acessos;
	}

	public void setAcessos(Map<String, Acesso> acessos) {
		this.acessos = acessos;
	}
	
	public boolean isUsuarioLogado() {
		HttpServletRequest request = (HttpServletRequest) FacesUtils
				.getServletRequest();

		return request.getSession().getAttribute("usuario") != null;
	}
}